﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços;

namespace TCC_Hotel.Apresentacao.FluxoHospedesAgora
{
    public partial class ExtenderEstadiaHospede : System.Web.UI.Page
    {
       
        ApartamentoService servico_Apartamento = new ApartamentoService();
        ReservaService servico_Reserva = new ReservaService();
        FluxoHospedesService servico_FluxoHospede = new FluxoHospedesService();

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Hospedes_Presentes)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                //limpa o chache existente para pegar os precos mais atualizados
                HttpContext.Current.Cache.Remove("Preco_Diaria");
                HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Agora");

                //Se nao vier parametro, redireciona o usuario para a tela inicial
                if (Request.Params["apartamento"] == null || Request.Params["dataInicio"] == null || Request.Params["dataFim"] == null || Request.Params["id"] == null)
                {
                    //Redireciona para a pagina inicial
                    Response.Redirect("~/");
                }

                string apartamento = Request.Params["apartamento"];
                string data_Inicial = Request.Params["dataInicio"];
                string data_Final = Request.Params["dataFim"];
                
                int ID = Convert.ToInt32(Request.Params["id"]);
                Fluxo_Hospedes corrente = servico_FluxoHospede.ListarFluxoHospedesAgoraCache().Where(i => i.ID == ID).FirstOrDefault();

                             
                //Monta o formulario para o usuario
                txtDataInicio.Text = data_Inicial.Substring(0, 10);
                txtDataFinal.Text = data_Final.Substring(0, 10);
                txtApartamento.Text = apartamento;
                txtNome.Text = servico_FluxoHospede.ListarFluxoHospedesAgoraCache().Where(i => i.ID == ID).FirstOrDefault().Nome_1;
                             
            }
        }

        /// <summary>
        /// Evento de click do botao salvar 
        /// </summary>
        protected void btnConfirmar_Click(object sender, EventArgs e)
        {
            
            //Recupera o parametro id da URL
            int ID = Convert.ToInt32(Request.Params["id"]);
            Fluxo_Hospedes corrente = servico_FluxoHospede.ListarFluxoHospedesAgoraCache().Where(i=>i.ID == ID).FirstOrDefault();

            List<Reserva_Particular> listaReservas_Particulares;
            List<Reserva_Faturada> listaReservas_Faturadas;
            List<DiaNomeReserva> listaDiasReservas;
            int apartamento = corrente.Numero_Apartamento;
            string data_Final = corrente.Data_Saida.ToString();
            string data_Final_Requisitada = txtDataFinal.Text;

            //verifica se a data requisitada não é menor do que a final
            if (data_Final_Requisitada.Length < 10)
            {
                MensagemJS("Data inválida!");
                return;
            }

            //verifica se a data requisitada não é menor do que a final
            if (Convert.ToDateTime(data_Final_Requisitada) <= Convert.ToDateTime(data_Final))
            {
                MensagemJS("Data indisponível! Data requisitada é menor ou igual que a data atual.");
                return;
            }

           

            //recupera todas as reservas para verificar a disponibilidade do hotel
            listaReservas_Particulares = servico_Reserva.RecuperarReservasParticularesApartamento(Convert.ToInt32(apartamento));
            listaReservas_Faturadas = servico_Reserva.RecuperarReservasFaturadasApartamento(Convert.ToInt32(apartamento));
            listaDiasReservas = servico_Reserva.ListarDiasReservas(listaReservas_Particulares, listaReservas_Faturadas);

            string ultimaDataDisponivel = servico_Reserva.VerificaUltimaDataDisponivel(data_Final, data_Final_Requisitada, listaDiasReservas);

            //Chama o serviço que valida o telefone
            if (ultimaDataDisponivel != "true")
            {
                txtDataFinal.Text = data_Final.ToString().Substring(0, 10);
                MensagemJS("Data indisponível no momento! Última data disponível para estender a estadia neste apartamento é " + ultimaDataDisponivel);
                return;
            }

           
            try
            {
                if (servico_FluxoHospede.ExtenderEstadia(ID, Convert.ToDateTime(data_Final_Requisitada)))
                {
                    MensagemJS("Estendida a estadia com sucesso!");
                    HttpContext.Current.Cache.Remove("Lista_Reserva_Particular");
                    HttpContext.Current.Cache.Remove("Lista_Reserva_Faturada");
                    HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Agora");
                    
                }
                else
                {
                    MensagemJS("ERRO: Ocorreu um erro e não foi processada a operação");
                    return;
                }
            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Ocorreu um erro e não foi processada a operação");
                return;

            }


        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Apresentacao/FluxoHospedesAgora/ListarHospedes.aspx");
        }

        /// <summary>
        /// Evento de click do botão de verificar disponibilidade na data especificada
        /// </summary>
        protected void btnVerificarDisponibilidade_Click(object sender, EventArgs e)
        {
          

            FluxoHospedesService servico_FluxoHospede = new FluxoHospedesService();
            //Recupera o parametro id da URL
            int ID = Convert.ToInt32(Request.Params["id"]);
            Fluxo_Hospedes corrente = servico_FluxoHospede.ListarFluxoHospedesAgoraCache().Where(i => i.ID == ID).FirstOrDefault();


            List<Reserva_Particular> listaReservas_Particulares;
            List<Reserva_Faturada> listaReservas_Faturadas;
            List<DiaNomeReserva> listaDiasReservas;
            int apartamento = corrente.Numero_Apartamento;
            string data_Final = corrente.Data_Saida.ToString();
            string data_Final_Requisitada = txtDataFinal.Text;

            //verifica se a data requisitada é válida
            if (data_Final_Requisitada.Length < 10)
            {
                MensagemJS("Data inválida!");
                return;
            }

            //verifica se a data requisitada não é menor do que a final
            if (Convert.ToDateTime(data_Final_Requisitada) <= Convert.ToDateTime(data_Final))
            {
                MensagemJS("Data indisponível! Data requisitada é menor ou igual que a data atual.");
                return;
            }

            //recupera todas as reservas para verificar a disponibilidade do hotel
            listaReservas_Particulares = servico_Reserva.RecuperarReservasParticularesApartamento(Convert.ToInt32(apartamento));
            listaReservas_Faturadas = servico_Reserva.RecuperarReservasFaturadasApartamento(Convert.ToInt32(apartamento));
            listaDiasReservas = servico_Reserva.ListarDiasReservas(listaReservas_Particulares, listaReservas_Faturadas);

            string ultimaDataDisponivel = servico_Reserva.VerificaUltimaDataDisponivel(data_Final, data_Final_Requisitada, listaDiasReservas);

            //Chama o serviço que valida o telefone
            if (ultimaDataDisponivel != "true")
            {
                txtDataFinal.Text = data_Final.ToString().Substring(0, 10);
                MensagemJS("Data indisponível no momento! Última data disponível para estender a estadia neste apartamento é " + ultimaDataDisponivel);
            }
            else
            {
                MensagemJS("Data disponível!");
            }
           
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "Mensagem",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }

        /// <summary>
        /// Evento de mudança de texto do TextBox da daa final. Usado para calcular e mostrar
        /// o preço a mais que deve ser pago pela estadia
        /// </summary>     
        protected void txtDataFinal_TextChanged(object sender, EventArgs e)
        {
            FluxoHospedesService servico_FluxoHospede = new FluxoHospedesService();
            GeralServices servico_Geral = new GeralServices();

            //Recupera o parametro id da URL
            int ID = Convert.ToInt32(Request.Params["id"]);
            Fluxo_Hospedes corrente = servico_FluxoHospede.ListarFluxoHospedesAgoraCache().Where(i => i.ID == ID).FirstOrDefault();
            
            //recuperas as datas especificadas
            int apartamento = corrente.Numero_Apartamento;
            DateTime data_Final = corrente.Data_Saida;
            DateTime data_Final_Requisitada = Convert.ToDateTime(txtDataFinal.Text);

            //verifica se a data requisitada é valida
            if (txtDataFinal.Text.Length < 10)
            {
                MensagemJS("Data inválida!");
                return;
            }

            //verifica se a data requisitada não é menor do que a final
            if (data_Final_Requisitada <= data_Final)
            {
                MensagemJS("Data indisponível! Data requisitada é menor que a data atual.");
                txtDataFinal.Text = data_Final.ToString().Substring(0, 10);
                return;
            }

            int numeroHospedes = servico_FluxoHospede.QuantidadeHospedes(corrente);
            
            //calcula o numero d diarias
            TimeSpan diariasMais = data_Final_Requisitada - data_Final;

            //calcula preco a ser pago para estender a estadia
            double precoMais = servico_Geral.RecuperarPrecoDiariaCache(numeroHospedes) * diariasMais.Days;

            txtPreco.Text = string.Format("{0:0.00}", precoMais); 
            txtDiarias.Text = diariasMais.Days.ToString();
        }
    }
}